/**
 * 
 */
package com.seascape.swms.framework.service;

import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.beetl.sql.core.SQLManager;
import org.springframework.beans.factory.annotation.Autowired;

import com.seascape.swms.framework.model.PageParam;
import com.seascape.swms.framework.model.PageResult;
import com.seascape.swms.framework.util.BeanUtil;

/**
 * @author Lay
 *
 */
public class BaseService<T> {

	@Autowired
	protected SQLManager sqlManager;

	/**
	 * 新增一条数据
	 * 
	 * @param model
	 *            实体类
	 * @return
	 */
	public boolean create(T model) {
		return sqlManager.insert(model, true) > 0;
	}

	/**
	 * 更新，只更新不为空的字段
	 * 
	 * @param model
	 * @return
	 */
	public boolean updateTemplate(T model) {
		return sqlManager.updateTemplateById(model) > 0;
	}

	/**
	 * 更新所有字段
	 * 
	 * @param model
	 * @return
	 */
	public boolean update(T model) {
		return sqlManager.updateById(model) > 0;
	}

	/**
	 * 根据id删除数据
	 * 
	 * @param id
	 *            主键值
	 * @return
	 */
	public int delete(Long id) {
		return sqlManager.deleteById(getCurrentEntityClassz(), id);
	}

	/**
	 * 获取当前注入泛型T的类型
	 * 
	 * @return 具体类型
	 */
	@SuppressWarnings("unchecked")
	private Class<T> getCurrentEntityClassz() {
		return (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}

	/**
	 * 根据id查询对象，如果主键ID不存在
	 * 
	 * @param id
	 * @return
	 */
	public T queryById(Object id) {
		T t = sqlManager.single(getCurrentEntityClassz(), id);
		return t;
	}

	public PageResult<T> templatePage(PageParam<T> pageParam) {
		BeanUtil.emptyToNull(pageParam.getParams());
		long total = sqlManager.templateCount(getCurrentEntityClassz(), pageParam.getParams());
		long start = (pageParam.getPageNo() - 1) * pageParam.getPageSize() + 1;
		List<T> result = sqlManager.template(getCurrentEntityClassz(), pageParam.getParams(), start, pageParam.getPageSize());
		return new PageResult<T>(result, total);
	}
	
	public List<T> template(T template) {
		BeanUtil.emptyToNull(template);
		return sqlManager.template(template);
	}
	
	public List<T> all(){
		return sqlManager.all(getCurrentEntityClassz());
	}
}
